// 导出一个axios的实例  而且这个实例要有请求拦截器 响应拦截器
import axios from 'axios'
import store from '@/store'
import { getTiemToken } from '@/utils/auth'
import router from '@/router'

// 设置过期时间
const ExpirationTime = 60 * 60 * 3
// 设置 检查过期时间函数
function CheckTime() {
  const currentTime = Date.now()
  // 检查过期时间 = (当前时间 - 登录之前的时间 /1000) >过期的时间
  return (currentTime - getTiemToken()) / 1000 > ExpirationTime
}

const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // 项目根地址
  timeout: 5000 // 设置网络请求的超时时间
}) // 创建一个axios的实例
// service.interceptors.request.use() // 请求拦截器
// 添加请求拦截器
service.interceptors.request.use(function(config) {
  // 在发送请求之前做些什么
  // 从vuex中拿到token 携带到vuex中
  const token = store.state.user.token
  if (token) {
    // 判断token有没有过期 如果过期了 ,就退出登录 清空token 清空用户信息
    if (CheckTime()) {
      // CheckTime() 如果返回的是true 就会走下面代码 token没有失效 否则不能进来判断条件
      store.commit('user/delToken') // 清空token
      store.commit('user/delInfo') // 清空用户信息
      router.push('/login') // 跳转到登录页
      // 手动抛出一个错误
      return Promise.reject(new Error('token失效了,请重新登录'))
    }
    // 如果有token 就给请求的headers
    config.headers['Authorization'] = `Bearer ${token}`
  }
  return config
}, function(error) {
  if (error.request.status === 401 && error.request.data.code === 10002) {
    store.commit('user/delToken') // 清空token
    store.commit('user/delInfo') // 清空用户信息
    router.push('/login') // 跳转到登录页
  }
  return Promise.reject(error)
})
// service.interceptors.response.use() // 响应拦截器
// 添加响应拦截器
service.interceptors.response.use(function(response) {
  // 对响应数据做点什么
  // 业务状态码错误的情况下,会经过拦截器的第一个正确function 第一个是处理正常代码
  // console.log(response)
  if (!response.data.success) {
    // 如果为 false 就会执行此代码 抛出一个错误信息给浏览器
    return Promise.reject(new Error(response.data.seccess))
  }
  return response.data
}, function(error) {
  // 对响应错误做点什么
  return Promise.reject(error)
})
export default service // 导出axios实例
